package com.teaphy.demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 反射 - 在运行中分析类的能力
 */
public class ReflectDemo {

	public static void main(String[] args) {
//		printClassDetail("java.lang.Double");
		printClassDetail("com.teaphy.data.Student");
	}

	/**
	 * 打印某个类的详情
	 * @param nameClass
	 */
	private static void printClassDetail(String nameClass) {
		try {
			Class cl = Class.forName(nameClass);

			// 访问权限
			int mod = cl.getModifiers();
			String modifier = Modifier.toString(mod);
			System.out.print(modifier);

			// 名称
			String name = cl.getName();
			System.out.print(" " + name + " ");

			// 父类
			Class supperClass = cl.getSuperclass();
			if (null != supperClass && supperClass != Object.class) {
				System.out.print("extend " + supperClass.getName());
			}


			// 实现的接口
			Class[] interfaces = cl.getInterfaces();

			for (int i = 0; i < interfaces.length; i++) {
				if (i == 0) {
					System.out.print(" implements ");
				} else {
					System.out.print(", ");
				}

				System.out.print(interfaces[i].getName());
			}

			System.out.println(" {");

			printField(cl);
			printConstructors(cl);
			printMethod(cl);

			System.out.println("}");

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.exit(0);
	}

	/**
	 * 打印 构造函数
	 */
	private static void printConstructors(Class cl) {
		Constructor[] constructors = cl.getDeclaredConstructors();

		for (Constructor con : constructors) {
			System.out.print("  ");
			// 访问权限
			int mod = con.getModifiers();
			String modifiers = Modifier.toString(mod);

			if (modifiers.length() > 0) {
				System.out.print(modifiers);
			} else {
				System.out.print("default ");
			}

			// 打印名称
			String name = con.getName();
			System.out.print(" " + name + " ");

			// 打印参数
			System.out.print("(");

			Class[] paramTypes = con.getParameterTypes();

			Class paramType;
			for (int i = 0; i < paramTypes.length; i++) {
				if (i > 0) {
					System.out.print(", ");
				}
				paramType = paramTypes[i];
				System.out.print(paramType.getName());
			}

			System.out.println(");");
		}
	}

	/**
	 * 打印 域
	 */
	private static void printField(Class cl) {
		Field[] fields = cl.getDeclaredFields();

		for (Field field : fields) {
			System.out.print("  ");
			// 访问权限
			int mod = field.getModifiers();
			String modifier = Modifier.toString(mod);
			if (modifier.length() > 0) {
				System.out.print(modifier + " ");
			} else {
				System.out.print("default ");
			}

			// 数据类型
			Class type = field.getType();
			String nameType = type.getName();
			System.out.print(nameType + " ");

			// 名称
			String name = field.getName();
			System.out.println(name + ";");
		}

	}

	/**
	 * 打印函数
	 */
	private static void printMethod(Class cl) {
		Method[] methods = cl.getDeclaredMethods();

		for (Method method : methods) {

			System.out.print("  ");

			// 访问权限
			int mod = method.getModifiers();
			String modifier = Modifier.toString(mod);
			if (modifier.length() > 0) {
				System.out.print(modifier + " ");
			} else {
				System.out.print("default ");
			}

			// 名称
			String name = method.getName();
			System.out.print(name);

			// 参数
			System.out.print("(");

			Class[] params = method.getParameterTypes();

			for (int i = 0; i < params.length; i++) {
				if (i > 0) {
					System.out.print(", ");
				}
				System.out.print(params[i].getName());
			}

			System.out.println(");");

		}
	}
}
